package com.project.web.core.config;

import java.util.ArrayList;
import java.util.List;

import com.google.common.base.Predicates;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.project.common.config.ProjectConfig;
import io.swagger.annotations.ApiOperation;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.Contact;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * Swagger2的接口配置
 *
 * @author project
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    /**
     * 系统基础配置
     */
    @Autowired
    private ProjectConfig ProjectConfig;

    /**
     * 是否开启swagger
     */
    @Value("${swagger.enabled}")
    private boolean enabled;

    /**
     * 设置请求的统一前缀
     */
//    @Value("${swagger.pathMapping}")
    private String pathMapping;


    @Bean
    public Docket customerApi() {
        //swagger2
//        return new Docket(DocumentationType.SWAGGER_2)
        //swagger3
        return new Docket(DocumentationType.OAS_30)
                // 这个可以自定义页面出现的标题，描述等信息
                .apiInfo(this.apiInfo())
                //分组名称
                .groupName("业务接口")
                // 是否开启swagger2，可以用作环境判断使用
                .enable(enabled)
                // 筛选
                .select()
                // 扫描的包
//                .apis(Predicates.or(
//                        RequestHandlerSelectors.basePackage("com.project.code.luck")
//                        , RequestHandlerSelectors.basePackage("com.project.code.spider")
//                ))
                .apis(RequestHandlerSelectors.basePackage("com.seed.invite.luck.xcx"))
                // 构建项目
                .build();
    }

    @Bean
    public Docket all() {
        //swagger2
//        return new Docket(DocumentationType.SWAGGER_2)
        //swagger3
        return new Docket(DocumentationType.OAS_30)
                // 这个可以自定义页面出现的标题，描述等信息
                .apiInfo(this.apiInfo())
                //分组名称
                .groupName("系统全量接口")
                // 是否开启swagger2，可以用作环境判断使用
                .enable(enabled)
                // 筛选
                .select()
                // 扫描的包
//                .apis(RequestHandlerSelectors.basePackage("com.ensd.adjust.price.controller.common"))
//                .apis(RequestHandlerSelectors.basePackage("com.seed.invite.luck.xcx"))
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                // 构建项目
                .build();
    }

    /**
     * 添加摘要信息
     */
    private ApiInfo apiInfo() {
        // 用ApiInfoBuilder进行定制
        return new ApiInfoBuilder()
                // 设置标题
                .title("标题：backend_接口文档")
                // 描述
                .description("描述：用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...")
                // 作者信息
                .contact(new Contact(ProjectConfig.getName(), null, null))
                // 版本
                .version("版本号:" + ProjectConfig.getVersion())
                .build();
    }
}
